package test;

import org.junit.Test;

import java.util.HashMap;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;

public class CommonTest1 {
    /**
     * 取模转换为位操作 a%(2的 n次方)=a & (2的 n次方-1)
     * https://www.codercto.com/a/30894.html
     */
    @Test
    public void test1(){
        System.out.println(29%32);
        System.out.println(29&31);
    }
    /**
     * hash code ,equals
     * https://www.oschina.net/question/82993_75533
     */
    @Test
    public void test2() {
        System.out.println(18%16);
        System.out.println(18&15);
    }

    /**
     * 基本类型int强转short时发生了什么？
     * 我们知道java中一个int类型占32bits(4字节)，一个short占16bits(2字节)
     * 强制转换时只取低16位(short类型占的那16位)，高16位(去掉低位多出来的那部分)属于溢出不计算，
     * 然后以二进制值与低16位的最大值执行按位与计算，得到最终结果
     *
     * 例如：int a=45678956;转换short结果就是364
     *
     * 10101110010000000101101100
     *           1111111111111111
     *           0000000101101100
     */
    @Test
    public void test3(){
        short a=0b0000000101101100;
        System.out.println(a);
        System.out.println(0b10000001);
        System.out.println((short)45678956);
    }

    /**
     * 模拟插入，和hash冲突
     *
     */
    @Test
    public void test4(){
        HashMap map=new HashMap();
        map.put("KING",100);
        map.put("BLAKE",10);
        map.put("WARD",99);

        map.put("CLARK",90);
        map.put("FORD",110);
        map.put("SMITH",10);

        map.put("JONES",99);
        map.get("a");
        map.put(null,null);
        map.put(null,null);

    }

    @Test
    public void test5(){
        int a;
        int b;
        int c;
        System.out.println((a = "KING".hashCode()) ^ (a >>> 16));
        System.out.println((b = "BLAKE".hashCode()) ^ (b >>> 16));
        System.out.println((c = "WARD".hashCode()) ^ (c >>> 16));

    }

    /**
     * 悲观锁，乐观锁，自旋
     * https://www.jianshu.com/p/d2ac26ca6525
     */
    @Test
    public void test7(){


    }

}
